//package com.wb3.meta.common.xss;
//
//import com.alibaba.fastjson.JSONObject;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.lang3.StringUtils;
//import org.springframework.http.HttpMethod;
//import org.springframework.stereotype.Component;
//
//import javax.servlet.*;
//import javax.servlet.annotation.WebFilter;
//import javax.servlet.http.HttpServletRequest;
//import java.io.IOException;
//import java.util.HashMap;
//import java.util.HashSet;
//import java.util.Map;
//import java.util.Set;
//
//@Slf4j
//@WebFilter(filterName = "customParamFilter", urlPatterns = {"/*"})
//@Component
//public class XssFilter implements Filter {
//
//    private static String key = "and|exec|insert|select|delete|update|count|chr|mid|master|truncate|char|declare|or|-|+";
//    private static Set<String> notAllowedKeyWords = new HashSet<String>(0);
//    private static String replacedString = "INVALID";
//    private String currentUrl;
//    static {
//        String keyStr[] = key.split("\\|");
//        for (String str : keyStr) {
//            notAllowedKeyWords.add(str);
//        }
//    }
//    @Override
//    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//        HttpServletRequest request = (HttpServletRequest) servletRequest;
//        XssRequest requestWrapper = new XssRequest(request);
//        try {
//            currentUrl = request.getRequestURI();
//            // get请求
//            if (requestWrapper.getMethod().equals(HttpMethod.GET.name())) {
//                // 对参数进行处理，得到新的参数，将参数重新设置到request中
//                Map<String, String> params = handleData(requestWrapper.getParameterMap());
//                requestWrapper.setParameter(params);
//            } else { // post请求，这里没有对x-www-form-urlencoded类型进行处理
//                String body = requestWrapper.getBody();
//                if (StringUtils.isNotEmpty(body)) {
//                    JSONObject jsonObject = JSONObject.parseObject(body);
//                    // 对参数进行处理
//                    Map<String, String> params = handleData(jsonObject);
//                    // 由于body是设置成不可变的，所以需要重新创建一个request，将body设置进去
//                    requestWrapper = new XssRequest(requestWrapper, JSONObject.toJSONString(params).getBytes());
//                }
//            }
//            filterChain.doFilter(requestWrapper, servletResponse);
//        } catch (Exception ex) {
//            log.error(ex.getMessage());
//        }
//
//    }
//
//    private Map<String, String> handleData(Map<String, String[]> params){
////        log.info("请求地址：{}", currentUrl);
//        Map<String, String> result = new HashMap<>();
//        if (params.size() > 0) {
//            Map<String, String> finalResult = result;
//            params.forEach((s, strings) -> {
////                log.info("s:{},strings:{}", s, strings);
////                if (strings.length > 0) {
////                }
//                finalResult.put(s, cleanXSS(strings[0]));
//            });
//        }
//        return result;
//    }
//
//    private Map<String, String> handleData(JSONObject jsonObject){
//        Map<String, String> result = null;
//        if (jsonObject.size() > 0) {
//            result = new HashMap<>();
//            Map<String, String> finalResult = result;
//            jsonObject.forEach((s, o) ->  {
////                log.info("s:{},o:{}", s, o);
//                finalResult.put(s, cleanXSS(o != null ? o.toString() : ""));
//            });
//        }
//        return result;
//    }
//
//    // 防止sql注入，xss攻击，cros恶意访问校验
//    private String cleanXSS(String valueP) {
//        // You'll need to remove the spaces from the html entities below
//        String value = valueP.replaceAll("<", "&lt;").replaceAll(">", "&gt;");
//        value = value.replaceAll("<", "& lt;").replaceAll(">", "& gt;");
//        value = value.replaceAll("\\(", "& #40;").replaceAll("\\)", "& #41;");
//        value = value.replaceAll("'", "& #39;");
//        value = value.replaceAll("eval\\((.*)\\)", "");
//        value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\"");
//        value = value.replaceAll("script", "");
//        value = cleanSqlKeyWords(value);
//        return value;
//    }
//
//    private String cleanSqlKeyWords(String value) {
//        String paramValue = value;
//        for (String keyword : notAllowedKeyWords) {
//            if (paramValue.length() > keyword.length() + 4
//                    && (paramValue.contains(" " + keyword) || paramValue.contains(keyword + " ") || paramValue.contains(" " + keyword + " "))) {
//                paramValue = StringUtils.replace(paramValue, keyword, replacedString);
//                log.error(this.currentUrl + "已被过滤，因为参数中包含不允许sql的关键词(" + keyword
//                        + ")" + ";参数：" + value + ";过滤后的参数：" + paramValue);
//            }
//        }
//        return paramValue;
//    }
//}
